/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package fase2.pt.iul.sid.database;

import fase2.pt.iul.sid.model.ComentarioAoEstabelecimentoModel;
import fase2.pt.iul.sid.model.ComentarioAoPratoModel;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;

/**
 *
 * @author Ricardo Marques
 */
public class ComentarioAoEstabelecimentoDAO {
    
    private FactoryConnection fc = null;
    
    public ComentarioAoEstabelecimentoDAO(FactoryConnection fc){
        this.fc = fc;
    }
    
    public List<ComentarioAoEstabelecimentoModel> getComentariosEstabelecimento(String email, int id, String texto_comentario,int avaliacao, boolean foto){
        
        List<ComentarioAoEstabelecimentoModel> ret = new LinkedList<>();

        int resultsetType =0;
        ConnectionHandler ch = new ConnectionHandler();
                
        try {
                fc.returnResultSetSelectStatement("select u.nome,u.email,ca.comentario,ca.nota,ca.estado,e.designacao,f.idFotografia,e.idEstabelecimento from ComentarioAoEstabelecimento ca "
                                                + "outer apply (select top 1* from Fotografia where idEstabelecimento=ca.idEstabelecimento order by ca.idEstabelecimento) as f "
                                                + "inner join Estabelecimento e on e.idEstabelecimento=ca.idEstabelecimento "
                                                + "inner join Utilizador u on ca.email=u.email "
                                                + "where ca.email like '%"+email+"%' "
                                                + "and (ca.idEstabelecimento="+id+" or 0="+id+") "
                                                + "and ca.comentario like '%"+texto_comentario+"%' "
                                                + "and ca.nota >="+avaliacao, resultsetType, ch);

            if(ch.r!=null){
                                
                while(ch.r.next()){
                    
                    boolean fotoEsta = ch.r.getInt("idFotografia") != 0;
                    
                    if(!fotoEsta && foto){
                        
                    }else{
                        ComentarioAoEstabelecimentoModel ce = new ComentarioAoEstabelecimentoModel(ch.r.getString("nome"),ch.r.getString("email"), ch.r.getString("comentario"),ch.r.getInt("nota"),ch.r.getInt("estado"),ch.r.getString("designacao"),fotoEsta,ch.r.getInt("idEstabelecimento"));
                        ret.add(ce);
                    }

                }
            }
            
        } catch (SQLException e) {
            e.printStackTrace();
        }
        
        return ret;
    }
    
     public ComentarioAoEstabelecimentoModel getComentarioEstabelecimento(int id, String email){
             
        List<ComentarioAoEstabelecimentoModel> lista = getComentariosEstabelecimento(email, id, "", 0, false);
        
        if(lista.size()>0){
            return lista.get(0);
        }else{
            return null;
        }
        
    }
    
    public boolean apagarComentarioAoEstabelecimento(int id, String email_autor){
        
        ConnectionHandler ch = new ConnectionHandler();
        
        fc.updateStatement("delete ComentarioAoEstabelecimento WHERE email='"+email_autor+"' and idEstabelecimento="+id, ch);
        
        return "1".equals(ch.returnStatus);

    }
    
    public boolean alterarComentarioAoEstabelecimento(int id, String email_autor, String comentario,int nota){
        
        ConnectionHandler ch = new ConnectionHandler();
        
        fc.updateStatement("update ComentarioAoEstabelecimento set comentario='"+comentario+"',nota="+nota+" where email='"+email_autor+"' and idEstabelecimento="+id, ch);
        
        return "1".equals(ch.returnStatus);
        
    }
    
    public List<ComentarioAoEstabelecimentoModel> getListaComentarios(int id, int numero_comentarios_mostrar, int numero_pagina){
        
        List<ComentarioAoEstabelecimentoModel> ret = new LinkedList<>();
        
        int resultsetType =0;
        ConnectionHandler ch = new ConnectionHandler();
        
        int inicio = 0;
        int fim = 0;
        
        if(numero_pagina<=1){
            inicio = 0;
            fim = numero_comentarios_mostrar;
        }else{
            inicio = numero_comentarios_mostrar * (numero_pagina-1);
            fim = numero_comentarios_mostrar * numero_pagina;
        }
                
        try {
                fc.returnResultSetSelectStatement("SELECT * FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY c.idEstabelecimento ) AS RowNum, c.idEstabelecimento,c.email,c.comentario,c.nota,c.estado,u.nome,e.designacao " +
                                                    "FROM ComentarioAoEstabelecimento c inner join Utilizador u on c.email=u.email inner join Estabelecimento e on e.idEstabelecimento=c.idEstabelecimento " +
                                                    "where (c.idEstabelecimento="+id+" or 0="+id+")   )AS RowConstrainedResult " +
                                                    "WHERE   RowNum > "+inicio+" " +
                                                    "AND RowNum <= "+fim+" " +
                                                    "ORDER BY RowNum", resultsetType, ch);

            if(ch.r!=null){
                                
                while(ch.r.next()){
                    
                        ComentarioAoEstabelecimentoModel ce = new ComentarioAoEstabelecimentoModel(ch.r.getString("nome"),ch.r.getString("email"), ch.r.getString("comentario"),ch.r.getInt("nota"),ch.r.getInt("estado"),ch.r.getString("designacao"),false,ch.r.getInt("idEstabelecimento"));
                        ret.add(ce);

                }
            }
            
        } catch (SQLException e) {
            e.printStackTrace();
        }
        
        return ret;
        
    }
    
    public boolean inserirComentarioAoEstabelicimento(int id, String email, String comentario,int nota){
        
        ConnectionHandler ch = new ConnectionHandler();
        
        fc.updateStatement("insert into ComentarioAoEstabelecimento values ("+id+",'"+email+"','"+comentario+"',"+nota+",0)", ch);
        
        return "1".equals(ch.returnStatus);
        
    }
    
}
